# -*- coding: utf-8 -*-
# Created by zhangyanqi on 2018/5/2

# 遍历时保留最后几个元素
from collections import deque


def getlast(items, n):
    """
    :param items: 需要被遍历的元素
    :param n: 需要被保留的元素
    :return: 被保留下来的元素
    """
    d = deque(maxlen=n)
    for item in items:
        d.append(item)


# 找到最小/最大的元素
import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums))  # Prints [42, 37, 23]
print(heapq.nsmallest(3, nums))

# 实现一个优先队列
import heapq

"""
这一小节我们主要关注 heapq 模块的使用。函数 heapq.heappush() 和 heapq. heappop() 分别在队列 _queue 上插入和删除第一个元素，并且队列 _queue 保证第一 个元素拥有最高优先级(1.4 节已经讨论过这个问题)。
heappop() 函数总是返回”最小 的”的元素，这就是保证队列 pop 操作返回正确元素的关键。另外，由于 push 和 pop 操作时间复杂度为 O(log N)，其中 N 是堆的大小，因此就算是 N 很大的时候它们运行 速度也依旧很快。
在上面代码中，队列包含了一个 (-priority, index, item) 的元组。优先级为负 数的目的是使得元素按照优先级从高到低排序。这个跟普通的按优先级从低到高排序 的堆排序恰巧相反。
index 变量的作用是保证同等优先级元素的正确排序。通过保存一个不断增加的 index 下标变量，可以确保元素按照它们插入的顺序排序。而且，index 变量也在相同 优先级元素比较的时候起到重要作用。
"""


class PriorityQueue(object):
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]


queue = PriorityQueue()
queue.push(1, 1)
queue.push(2, 2)
queue.push(3, 3)
print(queue._queue)
pop = queue.pop()
print(pop)


# 删除相同元素并且保持顺序
def dequpe(items):
    s = set()
    for item in items:
        if item not in s:
            yield item
            s.add(item)


# 命名切片
a = slice(2, 10, 1)
print(a.start)
print(a.step)
print(a.stop)
b = [1, 2, 3, 4, 54, 5, 4, 4, 4, 4, 4, ]
a_ = b[a]
print(a_)

# 通过某个关键字排序一个字典列表
from operator import itemgetter

d = [
    {"a": 1, "name": "jack"},
    {"a": 3, "name": "bob"},
    {"a": 2, "name": "tom"}
]
sorted1 = sorted(d, key=lambda item: item["a"])
sorted2 = sorted(d, key=itemgetter("a"))
print(sorted1)
print(sorted2)
